#include <iostream>
using std::cout;
using std::endl;

class Point
{
public:
    //在构造函数中需要对常量成员进行严格的初始化
    //如果没有进行初始化会直接报错
    Point(int x,int y)
    //初始化列表中对数据成员进行初始化是严格意义上的初始化
    : _ix(x)//const int _ix = x;
    , _iy(y)
    {
        //常量数据成员就要在初始化列表中进行初始化
        /* _ix = x; */
        /* _iy = y; */
        cout << "Point(int,int)" << endl;
    }

    ~Point(){
        cout << "~Point()" << endl;
    }

    Point(const Point & rhs)
    : _ix(rhs._ix)
    , _iy(rhs._iy)
    {
        cout << "Point(const Point&)" << endl;
    }

    /* Point & operator=(const Point & rhs){ */
        /* _ix = rhs._ix; */
        /* _iy = rhs._iy; */
        /* return *this; */
    /* } */

    void print(){
        cout << "(" << _ix
            << "," << _iy
            << ")" << endl;
    }
private:
    //C++11也允许了在声明时直接进行初始化
    //属于默认值的性质
    const int _ix = 1;
    const int _iy = 1;
};


void test0(){
    Point pt(10,8);
    pt.print();
    Point pt2 = pt;
    pt2.print();

    //一个类有const数据成员，就不能进行简单的赋值运算
    //除了在构造函数中可以对const数据成员初始化
    //在所有的成员函数中都不能对const数据成员进行修改
    /* pt = pt2; */

}

int main(void){
    test0();
    return 0;
}
